%format latexg

\documentstyle[11pt,german,makeidx]{article}

\parindent 0pt

%\typein[\nr]{Welches Kapitel? }
%\includeonly{\nr}

\newcommand{\anf}[1]{"`#1"'}
\newcommand{\abk}[1]{#1\@}
\newcommand{\nopagenumber}{\renewcommand{\thepage}{}}
%
%Die folgenden %-Zeichen nicht entfernen!
%
\newcommand{\deflabel}[1]{\bf #1\hfill}%
\newenvironment{deflist}[1]%
{\begin{list}{}%
{\settowidth{\labelwidth}{\bf #1}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\renewcommand{\makelabel}{\deflabel}}}%
{\end{list}}%

\makeindex

\begin{document}

\begin{titlepage}
\begin{center}
{\Huge\bf crystal}\\
\end{center}
\end{titlepage}
%
\tableofcontents

\newpage
\section{Einf�hrung}
\subsection{Was ist \anf{crystal}?}
\anf{crystal} ist der Versuch, f�r Modula-2 eine Standard - GEM -
Bibliothek zu schaffen. \anf{crystal}
\begin{itemize}
\item ber�cksichtigt
   \begin{itemize}
   \item ATARI-GEM 1.0, 1.2, 1.4, 3.x, 4.x
   \item MultiGEM, Mag!X
   \item GDOS, AMCGDOS, FSMGDOS, SpeedoGDOS, NVDI
   \item ABC-GEM 2.x,
   \item KAOS-GEM 1.42,
   \item PC-GEM 1.2, PC-GEM 2.x, GEM/3,
   \item X/GEM,
   \item X/GemOnX,
   \end{itemize}
\item f�ngt Unterschiede zwischen den einzelnen GEM~- Versionen ab
\item ist hochportabel
\item ist vollst�ndig angepa�t an TopSpeed~- M2, TDI~- M2,
      Megamax~- M2, H�nisch~- M2/ST, SPC~- M2, LPR~- M2
\item ist teilweise angepa�t Logitech~- M2,
      Software Developing System~- M2, Fitted Software Tools~- M2,
      Modular Software~- M2, ana~- M2/ST, FTL~- M2
\item bietet {\Large C}~- nahe Bezeichner,
      aber trotzdem kein Verzicht auf das
      Typenkonzept von Modula, d.h.\@
\item bietet neben Konstanten auch Mengen, Aufz�hlungen, Unterbereiche,
      Prozedurtypen und Pointertypen,
      \anf{QUALIFIED REEXPORT} von Typen und Konstanten,
      Typsynonyme
\item besitzt einen effizienten AES-Aufruf f�r MC 680x0-Systeme (modifiziertes
      Seimet~ - Verfahren)\index{Seimet - Verfahren}
\item ist frei kopierbar -- der Quelltext liegt offen und kann
      an jedes geeignete Modula~- System angepa�t werden
\item bietet eine st�ndig wachsende Zahl zus�tzlicher Moduln
\end{itemize}

\newpage
\subsection{Vorgeschichte}
\anf{crystal} entstand aus der Situation, da� mit den meisten
ATARI~- Modula~- Systemen zwar GEM~- Programme erstellt werden konnten,
jedoch jeder Hersteller seine eigene Art und Weise, GEM~-
Aufrufe zu t�tigen, anbot. Es gab also keinen Standard, h�chstens eine
Art \anf{TDI~- Standard}, da TDI wohl einer der ersten Modula~- Compiler
war, der f�r den GEM~- Rechner ATARI ST verf�gbar war. Man war sich
einig, da� ein GEM~- Standard aus der Taufe gehoben werden
mu�te. Ein Streit entbrannte �ber die Namensgebung und die
Modulaufteilung bzw.\@ die Namensgebung der Moduln. Die originalen
C~- Aufrufe benutzen z.B.\@ einen Unterstrich (\_), den es jedoch im
damaligen Modula~- Standard nach Wirth nicht gab. Und es gab Compiler, die
erlaubten trotzdem einen Unterstrich, andere jedoch hielten sich an Wirth.
Nachdem der Grundstein f�r \anf{crystal} gelegt worden war, hat es daher
noch einige Zeit gedauert, bis das Konzept von \anf{crystal} klar war.

\subsection{Das Konzept von \anf{crystal}}
Die Namensgebung \index{Namensgebung} bei \anf{crystal} ergibt sich aus dem
jeweiligen C~- Bezeichner,
aus dem die Unterstriche entfernt werden, bei dem die im Bezeichner
enthaltenen
Abk�rzungen nach Modula~- Manier, sprich in Gro�-/ Kleinschreibung
ausgeschrieben werden und dann unter Beibehaltung der Gro�-/ Kleinschreibung
wieder zur�ckgek�rzt werden. Zur Verdeutlichung dient ein Beispiel:

\begin{enumerate}
\item graf\_mkstate
\item grafmkstate
\item GraficsManagerMouseAndKeyboardState
\item GrafMKState
\end{enumerate}

Diese Vorgehensweise erscheint nicht unbedingt naheliegend, stellt jedoch
eine M�glichkeit dar, aus einem \anf{C~- Look} einen
\anf{Modula~- Look} zu machen, ohne auf die aus der Literatur gel�ufigen
\anf{Buchstabenfolgen} verzichten zu m�ssen und dabei noch die Compiler,
die (noch) keinen Unterstrich zulassen, zu ber�cksichtigen.\\
Soweit Namen f�r Typen vergeben werden mu�ten, die in den C~- Bindings
dank des spartanischen Typenkonzepts von C nicht vorgesehen waren,
wurden keine neuen, k�nstlichen C~-Namen erfunden, sondern
\anf{Modula~- like} Namen gew�hlt. Diese Namen stellen wohl die
eigentliche Schwierigkeit beim Umstieg von anderen Bibliotheken auf
\anf{crystal} dar.

\newpage
\section{�bersetzen von \anf{crystal}}
\subsection{Arbeiten mit dem Pr�prozessor}
\index{Pr�prozessor}
Was der Programmiersprache C zur Portabilit�t verhilft, n�mlich
der C~- Pr�prozessor, verhilft auch Modula~- 2 -- insbesondere bei
systemnahen Dingen wie GEM -- zur Portabilit�t. Viele Unterschiede
zwischen den verschiedenen Modula~- Compilern (wie auch bei C~- Systemen)
k�nnen abgefangen werden.
Es wurde jedoch Wert darauf gelegt, den Pr�prozessor~- Code umso mehr
zu verringern, je h�her ein Modul �ber der GEM~- Systemebene angesiedelt
ist. Hauptmoduln wie die beiliegenden Testprogramme kommen v�llig ohne
Pr�prozessor aus, desweiteren auch viele auf den GEM~- Aufrufen aufbauende,
h�here Moduln. Dort markiert der Pr�prozessor u.U.\@ nur noch das Datum
und tr�gt die Compileroptionen ein.

Legen Sie von den unter Verwendung des C~-Pr�processors~- Codes erstellten
Quelltexten aus dem Verzeichnis \verb|...\src| Kopien an. Diese Kopien
�bersetzen Sie dann mit einem Shell~-Script, da� z.B.\@ wie folgt lautet
(vgl.\@ \verb|...\bin\mupfel\c.mup|):

\begin{verbatim}
echo cpp $1 f�r $2...
cpp ~$1 -D$2 -P -imacros C:\USR\INCLUDE\CRYSTAL.M2H > temp
x2d1 <temp >$1
rm temp
\end{verbatim}

Ein Aufruf dieses Shell~-Scripts kann z.B.\@

\begin{verbatim}
c aes.mod HM2
\end{verbatim}

lauten. Dabei ist \verb|aes.mod| in diesem Beispiel der Name des Quelltextes,
\verb|HM2| eine Abk�rzung
f�r einen ganz bestimmten Compiler, s.\@ Liste der Modula~- Compiler.
cpp \index{cpp} ist der C~- Pr�prozessor. Er sollte in einem Verzeichnis
abgelegt sein, in dem er auch von der verwendeten Shell gefunden wird. Das
gleiche gilt f�r das Script. Meist
ist ein solches Verzeichnis in der Environmentvariablen \verb|PATH=|
aufgelistet. Mit Hilfe der Option \verb|-D| wird die an das
Script �bergebene Abk�rzung als Pr�prozessor~- Konstante definiert. Die
Option \verb|-P| unterdr�ckt unerw�nschte Kommentare im Output des
Pr�prozessors, die Option \verb|-imacros| l�dt ein Includefile \index{Includefile}
schon beim Aufruf des Pr�prozessors. Der Name des Verzeichnisses, in dem das
Includefile \verb|crystal.m2h| abgelegt ist, ist nat�rlich an Ihre
eigenen Verh�ltnisse anzupassen. \verb|x2d1| \index{x2d1} ist ein Beautifier,
der Zeilenenden mit \verb|CR LF| abschlie�t und �berfl�ssige Leerzeilen
entfernt. Er sollte ebenfalls in einem Verzeichnis liegen, in dem er von
der verwendeten Shell gefunden wird.
Um s�mtliche Moduln mit dem Pr�prozessor zu bearbeiten, benutzen Sie am
besten das Script \verb|...\bin\c_all.mup|, das Sie z.B.\@ wie folgt aufrufen:

\begin{verbatim}
c_all HM2
\end{verbatim}

Dieses Script geht davon aus, da� zum aktuellen Verzeichnis die
Unterverzeichnisse \verb|crystal| und \verb|toolbox| existieren.
Weiterhin wird davon ausgegangen, da� sich z.B.\@ auch die Dateien
\verb|flyinglo.*| aus \verb|...\src\flying| im Verzeichnis \verb|toolbox| befinden.
Passen Sie daher dieses Script an Ihre Verh�ltnisse und W�nsche an.

\newpage
\subsection{Hinweise zu Compilern}

\subsubsection{Fitted Software Tools - Modula V 3.1}
\index{Fitted Software Tools}
Die maximale Anzahl der Bezeichner pro Modul, maxIds, und der daf�r
reservierte Speicherplatz, idSpace, ist doch etwas zu knapp bemessen.
Starten Sie daher FSTM2 mit der Batchdatei \verb|...\cmp\fstm2\fstm2.bat|. Denken Sie
daran, da� eine GEM-Applikation noch etwas DOS-Speicher frei lassen
mu�. Dies wird z.B. in der Batchdatei \verb|...\cmp\fstm2\fstmake.bat| gemacht.

Die Anpassung an diesen Compiler ist vor�bergehend eingestellt, solange
keine Compiler~- Version zur Verf�gung steht, bei der Prozeduren -- wie
bei anderen Compilern auch -- Sets zur�ckliefern d�rfen.

\subsubsection{ana - Modula}
\index{ana - Modula}
Dieser Compiler (V 1.9) verlangt noch nach Exportlisten\index{Exportlisten}.
Weiterhin unterst�tzt
er keinerlei 16~- Bit~- Zahlenoperationen, sondern nur
32~- Bit~- Arithmetik. Beide Features wurden
eine Zeit lang unterst�tzt, z.B.\@ durch die Pr�prozessor~- Variable
\anf{export} (vgl.\@ noch \verb|PORTAB.DEF|) und \anf{long}, und es waren
portable GEM~- Programme lauff�hig. Doch mit der Zeit setzte sich die
Meinung durch, da� das oft erforderlich Umwandeln von 16~- Bit~-
GEM~- Daten in 32~- Bit~- Daten und eventuell wieder zur�ck zwar
portabel, aber untragbar war. Wer will, kann \anf{crystal}
insoweit erg�nzen, da� Quelltexte wieder portabel zu ana~- Modula
werden. Aber vielleicht gibt es mittlerweile eine neuere Version dieses
Compilers?

\subsubsection{TopSpeed - Modula V 1.17}
\index{TopSpeed - Modula V 1.17}
Um mit TopSpeed - Modula ein GEM - Programm linken zu k�nnen, sind
die Hinweise in der Zusatzdokumentation unter dem Punkt
\anf{Controlling the Order of Classes} zu beachten, d.h.\@ es
mu� die Datei \verb|order.obj| hinzugelinkt werden. Zur Erleichterung
dient die Batchdatei \verb|...\cmp\tsm2_1\gl.bat|. Denken Sie
daran, da� eine GEM-Applikation noch etwas DOS-Speicher frei lassen
mu�. Dies wird ebenfalls exemplarisch in der Batchdatei \verb|gl.bat| gemacht.

Weiterhin ist zu beachten, da� die AES- und VDI-Einspr�nge in den
Assemblermoduln AESSYS und VDISYS get�tigt werden. Sie befinden sich
im gleichen Verzeichnis wie \verb|gl.bat|.

\subsubsection{H�nisch - Modula}
\index{H�nisch - Modula}
Im neuesten H�nisch Compiler gibt es bereits BYTESET, LONGSET und VOID
als Standardbezeichner. Um einen Konflikt mit dem Modul INTRINSIC
\index{INTRINSIC} zu
vermeiden, mu� \verb|HM.ACC| gepatcht werden, d.h.\@ ersetzen Sie obige
Bezeichner z.B.\@ durch BYTESet, LONGSet und Void.

\subsubsection{SPC - Modula}
Compilieren Sie


\begin{verbatim}
BASEMAKE.CMD
AESMAKE.CMD
VDIMAKE.CMD
TOOLMAKE.CMD
\end{verbatim}

in dieser Reihenfolge.

\subsubsection{LPR - Modula}
\index{LPR - Modula}
Bei LPR - Modula kommt es beim Compilieren und Linken sowie beim Start des
Debuggers und eventuell auch des LPR~- Editors zu einem Konflikt
zwischen dem bereits vorhandenen
\verb|AES|~- Modul und dem \verb|AES|~- Modul von \anf{crystal}. Entweder
Sie verzichten auf den Debugger und �hnliche Programme und verschieben
die Original \verb|AES|~- Moduln (\verb|AES.SBM| und \verb|AES.OBM|)
in ein Verzeichnis, in dem die Dateien vom LPR~- System nicht
gefunden werden oder Sie m�ssen das LPR~- System patchen, siehe dazu
die Datei \verb|...\cmp\lprm2\patches.txt|.
\index{patches.txt}

Ein Programm, das nur Moduln aus \anf{crystal}
verwendet, ben�tigt vom LPR~- System nur \verb|GEMX.OBM|, \verb|SYSTEM.OBM|,
\verb|TERMINAL.OBM| und \verb|HEAP.OBM|.

Mit Hilfe von Dateien, deren Extension auf \verb|*.CM?| lautet, kann man
dem Compiler eine Liste von zu �bersetzenden Moduln �bergeben. �ndern
Sie zu diesem Zweck einfach die Suchmaske der Fileselektorbox bei
\anf{\verb|Modul ausw�hlen|} von
\verb|*.MOD| nach \verb|*.CM?|, w�hlen z.B.\@ \verb|BASEMAKE.CMP|
aus und rufen dann \anf{\verb|�bersetzen   Ctrl+�|} auf. �bersetzen Sie


\begin{verbatim}
BASEMAKE.CMP
AESMAKE.CMP
VDIMAKE.CMP
TOOLMAKE.CMP
\end{verbatim}

in dieser Reihenfolge. Die Reihenfolge dieser Dateien und auch die
darin enthaltene Reihenfolge von Moduln sollte nicht un�berlegt
ge�ndert werden, da in diesen Listen die Abh�ngigkeiten der Moduln
ber�cksichtigt sind.

Um den Heap eines LPRM2~- Compilates zu vergr��ern, mu� der Linker
gepatcht werden. Dazu dient
\verb|...\cmp\lprm2\patchlnk\patchlnk.tos|.
\index{patchlnk.tos}

\subsubsection{Modular Software - Modula}
\index{Modular Software - Modula}
F�r dieses System existiert nur eine grobe Anpassung, da der
Compiler doch sehr viel zu w�nschen �brig l��t.

\subsubsection{FTL - Modula}
\index{FTL - Modula}
Dieser Compiler scheint irgendwie Probleme mit dem Reexport \index{Reexport}
zu haben.
Tritt beim �bersetzten eines Implementationsmoduls die Fehlermeldung
\anf{Name mehrfach deklariert} auf, ist die angebliche
Mehrfachdeklaration im zugeh�rigen Definitionsmodul zu suchen. Bei der
Anpassung an diesen Compiler wurde immerhin soweit Sorge getragen, da�
sich die Testprogramme Hello und VDITest �bersetzen und ausf�hren
lassen.

\newpage
\subsection{Hinweise zu den verschiedenen GEM - Versionen}
\subsubsection{ATARI - GEM}
\index{ATARI - GEM}
Das ATARI~- GEM wird mittlerweile von ATARI selbst weiterentwickelt.
Mit dem Betriebssytem TOS 1.04 kamen die neuen AES~- Aufrufe
fsel\_ex\-in\-put() und wind\_new. Mit dem neuen MultiTOS \index{MultiTOS}
werden die AES multi\-tasking\-f�hig. Die Men�~- Bibliothek wird um
Popup~- und Submen�s erweitert. Es gibt eine Reihe von neuen
shel\_write()~- Modi.\\
Nicht zu vergessen ist das ABC~-GEM 2.2 \index{ABC - GEM}
der holl�ndischen Firma
ABC~- Software, welches PC~- GEM 2.2 f�r den ATARI zur Verf�gung
stellt, incl.\@ einer neuen GEM~- Draw~- Version, GEM~- Paint,
GEM~- Graph, GEM~- Wordchart \index{GEM - Wordchart} und einem neuen
GEM~- Output. Von allen diesen Programmen sind Demo~- Versionen erh�ltlich.

\subsubsection{PC - GEM}
\index{PC - GEM}
Die letzten PC~- GEM~- Versionen machten vor allem durch die
im VDI eingebauten Bezierfunktionen, von denen GEM~- Artline intensiven
Gebrauch machte, von sich reden. Seit GEM 2.x durfte der GEM~-
Desktop (nicht GEM an sich!) aufgrund eines ungerechten Streites
mit Apple \index{Apple} nur noch zwei Fenster anbieten.

\subsubsection{X/GEM}
\index{X/GEM}
Dies ist ein Realtime - Multitasking~- GEM unter dem Realtime~-
Multitasking~- Operatingsystem FlexOS, beides von DRI. \index{DRI} Man
bedenke, da� es
sehr wenige Realtime~- Multitasking~- Operatingsysteme
\index{Realtime - Multitasking} gibt (UNIX \index{UNIX} ist bis
auf Spezialversionen nicht echtzeitf�hig!). Daher bilden X/GEM und FlexOS
ein wirklich sehr exklusives Gespann! Es wird haupts�chlich zu Me�~-,
Steuer~- und Regelzwecken eingesetzt, z.B.\@ bei Siemens\index{Siemens}.\\
Rein �u�erlich ist X/GEM am \anf{PC~- Look} zu erkennen, jedoch ohne
Einschr�nkung der Fensterzahl. Jede Applikation erh�lt einen Desktop
in einem Fenster, das in der Gr��e ver�nderbar ist. Selbst der Desktop
des \anf{Desktop} befindet sich in einem Fenster. Darunter befindet sich
dann das Nichts, d.h.\ der blanke Bildschirm. �brigens gibt es Adimens
auch f�r X/GEM (Adimens GTX\index{Adimens GTX}).

Auf der Programmierebene bietet X/GEM einen erweiterten EvntMulti()~-
Aufruf: er hei�t schlicht EvntEvent() \index{EvntEvent()} und ist
zu EvntMulti() abw�rtskompatibel.

FlexOS \index{FlexOS} ist POSIX~- orientiert, \index{POSIX} netzwerkf�hig
und bietet die
M�glichkeit zur Laufzeit Ger�tetreiber einzubinden. FlexOS l�uft erst ab
intel 80286 \index{intel 80286} aufw�rts und hat mit DOS nur noch das
Dateisystem gemeinsam.

\subsubsection{X/GemOnX}
\index{X/GemOnX}
Diese GEM - Version stammt nicht von DRI, sondern von der bayrischen Firma
X/software \index{X/software}. X/GemOnX l�uft~-- der Name l��t es schon
vermuten~-- unter
UNIX \index{UNIX} und X~- Windows \index{X - Windows}.
X/GemOnX folgt der Server~- Client~- Architektur\index{Client - Server}.
Einer Applikation werden Libraryfunktionen hinzugelinkt, die Befehle und
Argumente in Pakete packen, �ber UNIX~- Interproze�~- Kommunikation
(UNIX domain sockets \index{domain sockets} oder TCP/IP\index{TCP/IP}) an
den X/GemOnX~- Server senden, R�ckgabedaten auspacken und der Applikation
zur Verf�gung stellen. Daneben gibt es asynchrone Mechanismen f�r die
Events und die user defined objects. Wie bei X~- Windows m�ssen
X/GemOnX~- Clients und X/GemOnX~- Server nicht auf ein und demselben
Rechner laufen. Daraus ergibt sich, da� die Resource \index{Resource} sich im
Adre�raum des X/GemOnX~- Servers befindet, also nicht direkt im Speicher
der Applikation ansprechbar ist. Solange man als C~- Programmierer die
Makros aus \verb|taddr.h| \index{taddr.h} benutzt hat, gibt es keine
Probleme beim Portieren. Die wenigsten werden sich daran gehalten haben
(C~- Programmierer \index{C - Programmierer} halten C f�r portabel,
programmieren aber zu oft unportable
Dinge damit). Bei \anf{crystal} ist u.a.\ deswegen der Zugriff auf AES~- Objekte �ber
Funktionen aus den Moduln GetObject \index{GetObject} und SetObject
\index{SetObject} obligatorisch.

\newpage
\subsection{\anf{crystal} und M2POSIX}
\index{M2POSIX}
Das M2POSIX~- Paket, erh�ltlich z.B.\@ von \verb|ftp.atari.archive.umich.edu|,
enth�lt wie \anf{crystal} die Moduln \verb|pSTORAGE| und \verb|PORATB|.
Diese sollte mit denjenigen von \anf{crystal} identisch sein, soda� man
entweder die einen oder die anderen benutzen kann. Im Falle von ATARI~- GEM
importiert \anf{crystal} aus dem M2POSIX~- Paket die Funktion
\verb|DosSystem.GetCookie()| sowie einige POSIX~- Funktionen f�r das
Modul \verb|ScrpMgr|.

\newpage
\section{Beschreibung der Moduln}
\subsection{Namensgebung}
S�mtliche AES~- Moduln besitzen Namen der Form \verb|XXXXMGR.*|. S�mtliche
VDI~- Moduln beginnen mit einem \verb|V|. Moduln namens \verb|XXXXTOOL.*|
stellen im allgemeinen Erweiterungen zu entsprechenden AES~- und VDI~-
Moduln zur Verf�gung.

\subsection{Das Modul PORTAB}
\index{PORTAB}

Dieses systemabh�ngige Modul stellt Typen zur Verf�gung, die jeweils
eine bestimmte Anzahl von Bytes belegen sollen um damit Datenstrukturen
von fremdem Code, z.B.\@ die AES~- und VDI~- Eingabearrays,
nachbilden zu k�nnen. Wichtig ist, da� hier systemabh�ngige Dinge
an zentraler Stelle ge�ndert werden k�nnen. Damit wird dem Vorwurf
von Prof.\@ Wirth \index{Wirth}, da� Modula~- Programmierer zu oft auf
Dinge aus SYSTEM zugreifen, Rechnung getragen.\\
Beispiel f�r irgendein herausgegriffenes System:

\begin{verbatim}

DEFINITION MODULE PORTAB;

IMPORT SYSTEM;

(* fixed Types *)

TYPE UNSIGNEDBYTE = [0..255];
     SIGNEDBYTE   = [-128..127];
     ANYBYTE      = SYSTEM.BYTE;

     UNSIGNEDWORD = SHORTCARD;
     SIGNEDWORD   = SHORTINT;
     ANYWORD      = SYSTEM.WORD;

     UNSIGNEDLONG = CARDINAL;
     SIGNEDLONG   = INTEGER;
     ANYLONG      = SYSTEM.LONGWORD;

     BYTESET = PACKEDSET OF [0..7];
     WORDSET = PACKEDSET OF [0..15];
     LONGSET = PACKEDSET OF [0..31];

\end{verbatim}

\index{UNSIGNEDBYTE}
\index{SIGNEDBYTE}
\index{ANYBYTE}
\index{UNSIGNEDWORD}
\index{SIGNEDWORD}
\index{ANYWORD}
\index{UNSIGNEDLONG}
\index{SIGNEDLONG}
\index{ANYLONG}
\index{BYTESET}
\index{WORDSET}
\index{LONGSET}

\begin{verbatim}

(* for open Arrays *)

TYPE ANYTYPE = SYSTEM.LOC;

\end{verbatim}

\index{ANYTYPE}

Je nach Compiler m�ssen f�r typfreie, offene Felder \verb|BYTE|,
\verb|WORD| oder \verb|LOC| aus \verb|SYSTEM| importiert werden.
Der Typ \verb|ANYTYPE| stellt eine portablere M�glichkeit dar, derartige
Felder zu verwenden.

\begin{verbatim}

(* avoiding SYSTEM.ADDRESS *)

TYPE ANYPOINTER = SYSTEM.ADDRESS;

\end{verbatim}

\index{ANYPOINTER}

Durch \verb|ANYPOINTER| macht man sich auch ein
kleines bi�chen \anf{SYS\-TEM\-un\-ab\-h�n\-gi\-ger}.

\begin{verbatim}

(* all Purpose Procedure Type *)

TYPE ANYPROC = PROCEDURE(ANYPOINTER);

\end{verbatim}

\index{ANYPROC}

\verb|ANYPROC| stellt den allgemeinsten Fall einer Prozedur dar.
Alle Parameter werden durch einen Zeiger auf dieselben �bergeben.

\begin{verbatim}

(* C-compatible NIL *)

CONST NULL = NIL;

\end{verbatim}

\index{NULL}

Bei systemnaher Programmierung ben�tigt man �fters einen Zeiger mit
dem Wert 0. Bei vielen Compilern ist dies gleichbedeutend mit
\verb|NIL|, bei einigen jedoch nicht.
Aus Gr�nden der Portabilit�t benutze man \verb|NULL|.

\subsection{Das Modul pSTORAGE} \index{pSTORAGE}
Leider ist das gew�hnliche Storage~- Modul nicht portabel. pSTORAGE
schafft Abhilfe.

\subsection{Das Modul RcMgr} \index{RcMgr}
Dieses Modul stellt tats�chlich einen Ausschnitt aus dem Quelltext der
AES dar und ist auch ein Bestandteil (zumindest die GRECT~- Struktur
\index{GRECT - Struktur} und
die Funktion rc\_intersect) von C~- Bibliotheken.

\subsection{Das Modul SetObject} \index{SetObject}
\subsection{Das Modul GetObject} \index{GetObject}
Mit Hilfe dieser beiden Moduln kann auf portable Art und Weise auf
die AES~- Objektstrukturen zugegriffen werden, selbst wenn man nicht
so gro�en Wert auf Portabilit�t beispielsweise zu X/GemOnX legt.
Zumindest sollte man GetObject.Type() und SetObject.Type() sowie
GetObject.Extnd() und SetObject.Extnd() benutzen, da der Zugriff auf
den erweiterten Objekttyp \index{erweiterter Objekttyp}
von Compiler zu Compiler unterschiedlich sein kann.

\subsection{Das Modul MenuTool} \index{MenuTool}
Die Funktion MenuKey() behandelt Men�~- Tastenk�rzel. Die einem Men�\-punkt
zugeordneten Tastenk�rzel, die mit der Control~- oder Alternate~- Taste
gebildet sein m�ssen, werden aus der Men�~- Resource selber ausgelesen.
Sie sind somit mit Hilfe eines Resource Construction Sets ver�nderbar.
Die �bersetzung der in der Resource abgelegten Tastenk�rzel~- Zeichenkette 
geschieht mit einer Art Tastaturtabelle, die ebenfalls in der Resourcedatei
vorhanden sein mu�. Die Tastaturtabelle wird an Hand eines speziellen
Flag im Root~- Objekt erkannt. Diese Tastaturtabelle kann oder mu� an
die verschiedenen landesspezifischen Tastaturen und Betriebssysteme
angepa�t werden.

\subsection{Das Modul FormTool} \index{FormTool}
Dieses Modul stellt etwas erweiterte Funktionen zu FormMgr zur Verf�gung,
insbesondere das Retten des Hintergrundrechtecks von Dialogboxen.

\subsection{Das Modul GrafTool} \index{GrafTool}
Dieses Modul stellt ein etwas komfortableres GrafMouse() zur Verf�gung.
Es �berwacht die Verschachtelungstiefe und speichert die letzte
Mausform.

\subsection{Das Modul ObjcTool} \index{ObjcTool}
Dieses Modul stellt Routinen zur Object~- Manipulation zur Verf�gung,
die �ber ObjcMgr und SetObject/GetObject hinausgehen.

\subsection{Das Modul RsrcTool} \index{RsrcTool}
Wird dieses Modul importiert, wird RsrcMgr.RsrcLoad() durch eine
etwas erweiterte Funktion ersetzt, welche eventuelle Fehlermeldungen
in der TOS~- Landessprache ausgibt. Die Funktion GetTreePtr()
korrigiert einen Mangel der AES, welche zu faul sind, Icons und
Images an das physikalische Bildschirmformat \index{Bildschirmformat}
anzupassen. Dies ist wichtig bei PC~- GEM und Grafikkarten.

\subsection{Das Modul AESTool} \index{AESTool}
Dieses Modul erm�glicht die portable Erzeugung sog.\@ user-defined objects.

\subsection{Das Modul ApplTool} \index{ApplTool}
Dieses Modul stellt die ab MultiTOS vorhandene Funktion ApplGetInfo()
zur Verf�gung. ApplGetInfo() wurde bewu�t nicht in ApplMgr aufgenommen,
da die Emulation von ApplGetInfo() sehr viel andere AES~- und VDI~-
Aufrufe ben�tigt und dies die Modulhierarchie einigerma�en verkomplizieren
w�rde.

\newpage
\section{Liste der Modula - Compiler}
\index{Modula - Compiler}

\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abk�rzung & Name                   & Hersteller/Vertrieb\\
          &                        &  \\
ANAM2     & ana Modula/ST          & ana systems\\
          &                        & P.O.\@ Box 4759\\
          &                        & Foster City, CA 94404-0759\\
          &                        & USA\\
CM2       & Collier Modula         &  \\
FSTM2     & Fitted Software Modula & Fitted Software Tools\\
          &                        & P.O.\@ Box 867403\\
          &                        & Plano, TX 75086\\
          &                        & USA\\
FTLM2     & FTL Modula/ST          & CCD\\
          &                        & Postfach 1164\\
          &                        & D-6228 Eltville\\
GNUM2     & GNU-Modula/ST/TT       & Free Software Foundation, Inc.\\
          &                        & 675 Mass Ave\\
          &                        & Cambridge, MA 02139\\
          &                        & USA\\
GPM2      & Gardens Point Modula   & A+L AG\\
          &                        & D�deriz 61\\
          &                        & CH-2540 Grenchen/SO\\
HM2       & H�nisch Modula/ST/TT   & MoSys G.b.R.\@\\
          &                        & c/o Thomas Uhl\\
          &                        & Obere Heerbergstr.\@ 17\\
          &                        & D-97078 W�rzburg\\
HSM2      & HiSoft Modula          & HiSoft\\
ISOM2     & ISO-Modula             & - \\
\end{tabular}
\end{table}

\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abk�rzung & Name                   & Hersteller/Vertrieb\\
          &                        & \\
JM2       & Jefferson Modula       & Jefferson Software\\
          &                        & 12416 North\\
          &                        & 28th Drive \#18-236\\
          &                        & Phoenix, AZ 85029-2434\\
          &                        & USA\\
LM2       & Logitech Modula        & Logitech Int.\@ S.A.\@\\
          &                        & CH-1122 Romanel/Morges\\
LPRM2     & LPR Modula             & TU M�nchen\\
MM2       & Megamax Modula         & Application Systems\\
          &                        & Heidelberg GmbH\\
          &                        & Postfach 102646\\
          &                        & D-6900 Heidelberg 1\\
MAMM2     & MAMOS Modula           & Mammut Software\\
          &                        & Pfruendhofstr. 23\\
          &                        & CH-8910 Affoltern/Albis\\
MCSM2     & Modula Cross System    & Beech Tree Systems\\
          &                        & Sorpestr.\@ 41\\
          &                        & D-5788 Winterberg\\
MSM2      & Modular Software Modula& Heim Verlag\\
          & ST Modular             & Heidelberger Landstr.\@ 194\\
          &                        & D-6100 Darmstadt-Eberstadt\\
RM2       & Rowley Modula/ST/TT    & Rowley Associates\\
          &                        & 32 Rowley\\
          &                        & Camp, Dursley\\
          &                        & Glos.\@ GL11 5NT\\
          &                        & UK\\
SBM2      & Stony Brook Modula     & Stony Brook Software\\
SDSM2     & Software Developing    & Interface Technologies\\
          & System                 & Corp.\\
SPCM2     & SPC Modula             & Compo Software\\
TDIM2     & TDI Modula             & TDI Ltd.\@\\
\end{tabular}
\end{table}

\newpage
\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abk�rzung & Name                   & Hersteller/Vertrieb\\
          &                        &  \\
TM2       & Taylor Modula          & Heynm�ller\\
          &                        & Informationssysteme GmbH\\
          &                        & Oxfordstr. 10\\
          &                        & D-5300 Bonn 1\\
TSM2      & TopSpeed Modula        & A+L AG\\
          &                        & D�deriz 61\\
          &                        & CH-2540 Grenchen/SO\\
XAM2      & ana Modula/UNIX        & ana systems, s.o.\\
XGM2      & GNU Modula/UNIX        & FSF, s.o.\\
XGPM2     & Gardens Point/UNIX     & A+L AG, s.o.\\
XHM2      & H�nisch Modula/UNIX    & MoSys G.b.R.\@, s.o.\\
XRM2      & Rowley Modula/UNIX     & Rowley Associates, s.o.\\
CBM2      & Cambridge Modula/UNIX  & University of Cambridge\\
MWM2      & Metrowerks Modula/UNIX & Metrowerks, Inc.\\
          &                        & The Trimex Building, Rte 11\\
          &                        & Mooers, NY 12958\\
          &                        & USA\\
XTM2      & Taylor Modula/UNIX     & Heynm�ller, s.o.\\
MOCM2     & MoCKa/UNIX             & GMD\\
          &                        & c/o J�rgen Vollmer\\
          &                        & Vincenz-Prie�nitz-Str.\@ 1\\
          &                        & D-76131 Karlsruhe 1
\end{tabular}
\end{table}

\newpage
\section{Literatur}
ATARI ST/TT - Profibuch, SYBEX - Verlag GmbH D�sseldorf,
ISBN 3-88745-563-0

Obwohl ein ATARI-spezifisches Buch, steht sehr viel Wissenswertes
�ber GEM darin.

\bigskip
Vom Anf�nger zum GEM-Profi, H�thig Verlag Heidelberg,
ISBN 3-7785-1792-9

Ein Buch, in dem es nur um GEM geht. Es bietet eine umfangreiche,
jedoch leider in C geschriebene, auf GEM aufsetzende Fensterbibliothek.
Die Quelltexte warten auf ihre �bertragung nach Modula-2.

\bigskip
GEM Programmier-Handbuch, SYBEX - Verlag GmbH D�sseldorf,
ISBN ?

Hier wird der Quelltext zu Doodle ausf�hrlich erl�utert. Die Autoren
sind ehemalige DRI-Mitarbeiter.

\bigskip
Professionell GEM (ProGEM), Antic Publishing

H�chst interessante Artikelserie des RCS-Autors Tim Oren. Erh�ltlich
in mehreren Dateien aus verschiedenen �ffentlichen Quellen.

\bigskip
X/GemOnX, unix/mail 9/91, S.\@ 36 ff.

Ein Artikel, der �ber X/GemOnX einiges berichtet.

\printindex

\end{document}
